#pragma once
#include <string>
#include <type_traits>
#include <vector>
#include <list>
#include <set>
#include <unordered_set>
#include <array>
#include <map>
#include <unordered_map>
#include <bitset>

//template<typename T>
//using Decay = typename std::decay<T>::type;
namespace rapidjson {
//以下是std的标准容器类型，如果有用到其他的容器可以在后面再添加
template<typename T>
struct is_std_vector : std::false_type {};
template<typename T, typename Alloc>
struct is_std_vector<std::vector<T, Alloc>> : std::true_type {};

template<typename T>
struct is_std_set : std::false_type {};
template<typename K, typename Cmp, typename Alloc>
struct is_std_set<std::set<K, Cmp, Alloc>> : std::true_type {};
template <typename K, typename Hash, typename Pred, typename Alloc>
struct is_std_set<std::unordered_set<K, Hash, Pred, Alloc>> : std::true_type {};

template<typename T>
struct is_std_list : std::false_type {};
template<typename T, typename Alloc>
struct is_std_list<std::list<T, Alloc>> : std::true_type {};

template<typename T>
struct is_std_array : std::false_type {};
template<typename T, std::size_t N>
struct is_std_array<std::array<T, N>> : std::true_type {};

template<typename T>
struct is_std_map : std::false_type {};
template<typename K, typename V, typename Cmp, typename Alloc>
struct is_std_map<std::map<K, V, Cmp, Alloc>> : std::true_type {};
template <typename K, typename V, typename Hash, typename Pred, typename Alloc>
struct is_std_map<std::unordered_map<K, V, Hash, Pred, Alloc>> : std::true_type {};

template<typename T>
struct is_std_bitset : std::false_type {};
template<std::size_t N>
struct is_std_bitset<std::bitset<N>> : std::true_type {};

template<typename T>
struct is_container : std::integral_constant<bool, 
	is_std_vector<T>::value 
	|| is_std_set<T>::value
	|| is_std_list<T>::value
	|| is_std_array<T>::value> {};

template<typename T>
struct is_special_type : std::integral_constant<bool,
	is_std_map<T>::value
	|| is_std_bitset<T>::value> {};

//判断是否是json所支持的基础类型
template<typename T>
struct is_json_type : std::integral_constant<bool, std::is_same<T, std::string>::value || std::is_arithmetic<T>::value> {};
//判断是否除去json基础类型、特殊类型、std容器、数组等之外的类或结构体
template<typename T>
struct is_json_class : std::integral_constant<bool, !is_json_type<T>::value 
													&& !is_special_type<T>::value
													&& !is_container<T>::value 
													&& !std::is_array<T>::value
													&& std::is_class<T>::value> {};

/*
struct Custom {
	T data;
	//如果需要定制反序列化就实现
	void deserialize(const rapidjson::Value &value);
	//如果需要定制序列化就实现
	void serialize(rapidjson::StdStringWriter &writer) const;
	//如果需要强制转换就实现
	explicit operator T() { return data; }
};
*/

} // end of namespace rapidjson